
package com.gustozzi.distribucion.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import com.gustozzi.distribucion.dao.TransporteDAO;
import com.gustozzi.distribucion.dao.util.Constantes;
import com.gustozzi.distribucion.dao.util.DataAccess;
import com.gustozzi.distribucion.dao.util.DataAccessExceptions;
import com.gustozzi.distribucion.dao.util.DataAccessGeneric;
import com.gustozzi.domain.CentroDistribucion;
import com.gustozzi.domain.Chofer;
import com.gustozzi.domain.Despacho;
import com.gustozzi.domain.ReservaTransporte;
import com.gustozzi.domain.SolicitudTransporte;
import com.gustozzi.domain.Transporte;

public class TransporteDAOImpl extends DataAccessGeneric implements TransporteDAO
{

    public TransporteDAOImpl(DataAccess transaccion)
    {
        super(transaccion);
    }

    @Override
    public List<ReservaTransporte> obtenerListaReservaTransporte(int codigoReserva, Date fechaDesde, Date fechaHasta,
            String placa) throws DataAccessExceptions
    {

        Connection connection = null;
        CallableStatement cs = null;
        ResultSet rs = null;
        List<ReservaTransporte> listaReservaTransporte = null;

        ReservaTransporte beanReservaTransporte = null;
        try
        {
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_ReservaTransporte);
            cs.setInt(1, codigoReserva);
            cs.setDate(2, fechaDesde);
            cs.setDate(3, fechaHasta);
            cs.setString(4, placa);

            rs = cs.executeQuery();
            cs.execute();
            rs = cs.getResultSet();
            listaReservaTransporte = new ArrayList<ReservaTransporte>();

            while (rs.next())
            {
                beanReservaTransporte = new ReservaTransporte();
                beanReservaTransporte.setCodigoReserva(rs.getString(Constantes.PARAM_CORESERVATRANSPORTE));

                Transporte beanTransporte = new Transporte();
                beanTransporte.setCodigoTransporte(rs.getString(Constantes.PARAM_COUNIDADTRANSPORTE));
                beanTransporte.setPlaca(rs.getString(Constantes.PARAM_PLACA));
                beanReservaTransporte.setTrans(beanTransporte);

                beanReservaTransporte.setFechaReserva(rs.getDate(Constantes.PARAM_FECHARESERVATRANSPORTE));
                beanReservaTransporte.setFechaRequerimiento(rs.getDate(Constantes.PARAM_FECHAREQUERIMIENTOTRANSPORTE));
                beanReservaTransporte.setEstado(rs.getString(Constantes.PARAM_ESTADOTRANSPORTE));

                listaReservaTransporte.add(beanReservaTransporte);
            }
            rs.close();
            cs.close();
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions(e);
        }
        return listaReservaTransporte;
    }

    @Override
    public List<Transporte> obtenerListaTransporte(int codigo, int centroDistribucion, int chofer, String placa,
            Date fechaDesde, Date fechaHasta) throws DataAccessExceptions
    {

        Connection connection = null;
        CallableStatement cs = null;
        ResultSet rs = null;
        List<Transporte> listaTransporte = null;
        Transporte beanTransporte = null;

        try
        {
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_Transporte);
            cs.setInt(1, codigo);
            cs.setInt(2, centroDistribucion);
            cs.setInt(3, chofer);
            cs.setString(4, placa);
            cs.setDate(5, fechaDesde);
            cs.setDate(6, fechaHasta);
            rs = cs.executeQuery();
            cs.execute();
            rs = cs.getResultSet();
            listaTransporte = new ArrayList<Transporte>();
            while (rs.next())
            {
                beanTransporte = new Transporte();
                beanTransporte.setCodigoTransporte(rs.getString(Constantes.PARAM_COUNIDADTRANSPORTE));

                CentroDistribucion centro = new CentroDistribucion();
                centro.setCodigo(rs.getString(Constantes.PARAM_COCENTRODISTRIBUCION));
                centro.setNombre(rs.getString(Constantes.PARAM_DESNOMBRE));
                beanTransporte.setCentroDistribucion(centro);

                Chofer transchofer = new Chofer();
                transchofer.setPrimerNombre(rs.getString(Constantes.PARAM_DESCHOFER));
                transchofer.setCodigo(rs.getString(Constantes.PARAM_COCHOFER));
                beanTransporte.setChofer(transchofer);

                beanTransporte.setPlaca(rs.getString(Constantes.PARAM_PLACA));
                beanTransporte.setFechaRequerimiento(rs.getDate(Constantes.PARAM_FECHAREQUERIMIENTO));
                beanTransporte.setModelo(rs.getString(Constantes.PARAM_MODELO));
                beanTransporte.setColor(rs.getString(Constantes.PARAM_COLOR));
                beanTransporte.setKilometros(rs.getString(Constantes.PARAM_KILOMETROS));
                beanTransporte.setPeso(rs.getDouble(Constantes.PARAM_PESO));

                listaTransporte.add(beanTransporte);
            }
            rs.close();
            cs.close();
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions(e);
        }
        return listaTransporte;
    }

    @Override
    public List<SolicitudTransporte> obtenerListaSolicitudTransporte(String codigo, String centro, String despacho,
            String placa, Date fechaDesde, Date fechaHasta) throws DataAccessExceptions
    {

        Connection connection = null;
        CallableStatement cs = null;
        ResultSet rs = null;

        List<SolicitudTransporte> listaSolicitudTransporte = null;
        List<Transporte> listaTransporte = null;
        SolicitudTransporte beanSolicitudTransporte1 = null;
        Transporte trans = null;
        String codigoAnterior = "";
        try
        {
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_Solicitud_Transporte);
            cs.setString(1, codigo);
            cs.setString(2, centro);
            cs.setString(3, despacho);
            cs.setString(4, placa);
            cs.setDate(5, fechaDesde);
            cs.setDate(6, fechaHasta);
            rs = cs.executeQuery();
            cs.execute();
            rs = cs.getResultSet();
            listaSolicitudTransporte = new ArrayList<SolicitudTransporte>();
            listaTransporte = new ArrayList<Transporte>();

            while (rs.next())
            {

                if (codigoAnterior.equalsIgnoreCase(""))
                {

                    beanSolicitudTransporte1 = new SolicitudTransporte();

                    beanSolicitudTransporte1.setCodigo(rs.getString(1));
                    beanSolicitudTransporte1.setFechaSolicitud(rs.getDate(2));

                    Despacho despachoTransporte1 = new Despacho();
                    despachoTransporte1.setCodigo(rs.getString(3));
                    beanSolicitudTransporte1.setDespacho(despachoTransporte1);

                    trans = new Transporte();
                    trans.setCodigoTransporte(rs.getString(5));
                    trans.setPlaca(rs.getString(8));
                    trans.setModelo(rs.getString(9));
                    trans.setPeso(rs.getDouble(10));
                    listaTransporte.add(trans);

                    CentroDistribucion centroDistribucion = new CentroDistribucion();
                    centroDistribucion.setCodigo(rs.getString(6));
                    centroDistribucion.setNombre(rs.getString(7));
                    beanSolicitudTransporte1.setCentro(centroDistribucion);
                    beanSolicitudTransporte1.setEstado(rs.getString(11));

                }

                else if (codigoAnterior.equalsIgnoreCase(rs.getString("CoSolicitudTransporte")))
                {

                    trans = new Transporte();
                    trans.setCodigoTransporte(rs.getString(5));
                    trans.setPlaca(rs.getString(8));
                    trans.setModelo(rs.getString(9));
                    trans.setPeso(rs.getDouble(10));
                    listaTransporte.add(trans);

                }

                else
                {
                    beanSolicitudTransporte1.setListaTransporte(listaTransporte);
                    listaSolicitudTransporte.add(beanSolicitudTransporte1);
                    listaTransporte = new ArrayList<Transporte>();

                    beanSolicitudTransporte1 = new SolicitudTransporte();

                    beanSolicitudTransporte1.setCodigo(rs.getString(1));
                    beanSolicitudTransporte1.setFechaSolicitud(rs.getDate(2));

                    Despacho despachoTransporte1 = new Despacho();
                    despachoTransporte1.setCodigo(rs.getString(3));
                    beanSolicitudTransporte1.setDespacho(despachoTransporte1);

                    trans = new Transporte();
                    trans.setCodigoTransporte(rs.getString(5));
                    trans.setPlaca(rs.getString(8));
                    trans.setModelo(rs.getString(9));
                    trans.setPeso(rs.getDouble(10));

                    listaTransporte.add(trans);

                    CentroDistribucion centroDistribucion = new CentroDistribucion();
                    centroDistribucion.setCodigo(rs.getString(6));
                    centroDistribucion.setNombre(rs.getString(7));
                    beanSolicitudTransporte1.setCentro(centroDistribucion);
                    beanSolicitudTransporte1.setEstado(rs.getString(11));
                    trans = new Transporte();
                    trans.setCodigoTransporte(rs.getString(5));
                    trans.setPlaca(rs.getString(8));
                    trans.setModelo(rs.getString(9));
                    trans.setPeso(rs.getDouble(10));
                    listaTransporte.add(trans);
                }
                codigoAnterior = rs.getString("CoSolicitudTransporte");

            }

            if (beanSolicitudTransporte1 != null)
            {
                beanSolicitudTransporte1.setListaTransporte(listaTransporte);
                listaSolicitudTransporte.add(beanSolicitudTransporte1);
            }
            rs.close();
            cs.close();

        }

        catch (Exception e)
        {
            throw new DataAccessExceptions(e);
        }
        return listaSolicitudTransporte;

    }

    public List<Transporte> obtenerListaTransporte(String codigoSolicitud)
    {

        List<Transporte> listaTransporte = new ArrayList<Transporte>();

        Transporte transporte1 = new Transporte();
        transporte1.setCodigoTransporte("Trans0001");
        transporte1.setPlaca("Placa0001");

        Transporte transporte2 = new Transporte();
        transporte2.setCodigoTransporte("Trans0002");
        transporte2.setPlaca("Placa0002");

        listaTransporte.add(transporte1);
        listaTransporte.add(transporte2);

        return listaTransporte;

    }

    @Override
    public String guardarReservaTransporte(int codigoReserva, int codigoUnidadTransporte, String fechaRequerimiento,
            String fechaReserva) throws DataAccessExceptions
    {
        Connection connection = null;
        CallableStatement cs = null;
        String respuesta = "";
        SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
        Date fecRec = null;
        Date fecReserva = null;
        try
        {

            fecRec = new Date(sdf.parse(fechaRequerimiento).getTime());
            fecReserva = new Date(sdf.parse(fechaReserva).getTime());
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_InsertReserva_Transporte);
            cs.setInt(1, codigoReserva);
            cs.setInt(2, codigoUnidadTransporte);
            cs.setDate(3, fecRec);
            cs.setDate(4, fecReserva);

            int entero = cs.executeUpdate();
            connection.commit();
            if (entero > 0)
            {
                respuesta = "OK";
            }
            else
            {
                respuesta = "ERROR";
            }
            cs.close();
        }
        catch (SQLException e)
        {
            try
            {
                cs.close();
            }
            catch (SQLException e1)
            {
                throw new DataAccessExceptions(e);
            }
            throw new DataAccessExceptions(e);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return respuesta;
    }

    @Override
    public String guardarTransporte(int codigo, int codigoCentro, int codigoChofer, String placa, String color,
            int kilometros, Double peso, String modelo, String fechaRequerimiento) throws DataAccessExceptions
    {
        Connection connection = null;
        CallableStatement cs = null;
        String respuesta = "";
        SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
        Date desde = null;
        try
        {
            System.out.println("FechaRequerimiento");
            desde = new Date(sdf.parse(fechaRequerimiento).getTime());
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_Insert_Transporte);
            cs.setInt(1, codigo);
            cs.setInt(2, codigoChofer);
            cs.setInt(3, codigoCentro);
            cs.setString(4, placa);
            cs.setDate(5, desde);
            cs.setInt(6, kilometros);
            cs.setString(7, color);
            cs.setString(8, modelo);
            cs.setDouble(9, peso);

            int entero = cs.executeUpdate();
            connection.commit();
            if (entero > 0)
            {
                respuesta = "OK";
            }
            else
            {
                respuesta = "ERROR";
            }
            cs.close();
        }
        catch (SQLException e)
        {
            try
            {
                cs.close();
            }
            catch (SQLException e1)
            {
                throw new DataAccessExceptions(e);
            }
            throw new DataAccessExceptions(e);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return respuesta;
    }

    @Override
    public List<Transporte> obtenerListaTransporteReserva() throws DataAccessExceptions
    {

        Connection connection = null;
        CallableStatement cs = null;
        ResultSet rs = null;
        List<Transporte> listaTransporte = null;
        Transporte beanTransporte = null;

        try
        {
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_T_DI_UnidadTransporte);
            cs.setInt(1, 1);

            rs = cs.executeQuery();
            cs.execute();
            rs = cs.getResultSet();
            listaTransporte = new ArrayList<Transporte>();
            while (rs.next())
            {
                beanTransporte = new Transporte();
                beanTransporte.setCodigoTransporte(rs.getString(Constantes.PARAM_COUNIDADTRANSPORTE));
                beanTransporte.setPlaca(rs.getString(Constantes.PARAM_PLACA));
                beanTransporte.setPeso(rs.getDouble(Constantes.PARAM_PESO));

                listaTransporte.add(beanTransporte);
            }
            rs.close();
            cs.close();
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions(e);
        }
        return listaTransporte;
    }

    @Override
    public String eliminarReservaTransporte(int codigo) throws DataAccessExceptions

    {

        Connection connection = null;
        CallableStatement cs = null;
        String respuesta = "";
        try
        {
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_Delete_ReservaTransporte);
            cs.setInt(1, codigo);
            int entero = cs.executeUpdate();
            connection.commit();
            if (entero > 0)
            {
                respuesta = "OK";
            }
            else
            {
                respuesta = "ERROR";
            }
            cs.close();
        }
        catch (SQLException e)
        {
            try
            {
                cs.close();
            }
            catch (SQLException e1)
            {
                throw new DataAccessExceptions(e);
            }
            throw new DataAccessExceptions(e);
        }
        return respuesta;
    }

    @Override
    public String eliminarTransporte(int codigo) throws DataAccessExceptions

    {
        Connection connection = null;
        CallableStatement cs = null;
        String respuesta = "";
        try
        {
            connection = this.transaccion.getConnection();
            cs = connection.prepareCall(Constantes.SS_Delete_Transporte);
            cs.setInt(1, codigo);
            int entero = cs.executeUpdate();
            connection.commit();

            if (entero >= 0)
            {
                respuesta = "OK";
            }
            else
            {
                respuesta = "ERROR";
            }
            cs.close();
            // connection.close();
        }
        catch (SQLException e)
        {
            try
            {
                cs.close();
            }
            catch (SQLException e1)
            {
                throw new DataAccessExceptions(e);
            }
            throw new DataAccessExceptions(e);
        }
        return respuesta;
    }

}
